/* Copyright 2008 Bas van den Berg
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "PromptBuilder.h"
#include "StringBuilder.h"
#include "Stats.h"
#include "MudPlayer.h"
#include "myassert.h"
#include "color.h"

using namespace Chronos;
using namespace std;


PromptBuilder::PromptBuilder(const string& prompt_, const MudPlayer& player_)
    : prompt(prompt_)
    , lastHealth(-1)
    , player(player_)
{}


void PromptBuilder::setPrompt(const string& prompt_) { prompt = prompt_; }


const string& PromptBuilder::getPrompt() const { return prompt; }


void PromptBuilder::print(StringBuilder& buffer) const {
    const char* str = prompt.c_str();
    int health = player.getStats().getHealth();
    while (*str) {
        if (*str == '%') {
            ++str;
            switch (*str) {
            case 'h':
                buffer << health;
                break;
            case 'H':
                buffer << player.getStats()[Stats::maxHealth];
                break;
            case 'd':
                {
                    if (lastHealth == -1) lastHealth = health;
                    int diff = health - lastHealth;
                    if (diff != 0) {
                        buffer << '(';
                        if (diff > 0) { buffer << ANSI_GREEN << '+'; }
                        else buffer << ANSI_RED;
                        buffer << diff << ANSI_NORMAL << ')';
                    }
                    lastHealth = health;
                }
                break;
            default:
                ASSERT_FAIL();
            }
        } else {
            buffer << *str;
        }
        ++str;
    }
}

